package classic150;

/**
 * <h3>leetcode</h3>
 *
 * @author BigFaceCat
 * @date 2023/11/7 8:35
 * @description <p>leetcode26-删除有序数组中的重复项-数组-简单题</p>
 */
public class No26 {

    public static void main(String[] args) {
        int[] nums = {0, 0, 1, 1, 1, 2, 2, 3, 3, 4};
        int k = removeDuplicates(nums);
        System.out.println(k);
        for (int i = 0; i < k; i++) {
            System.out.print(nums[i] + " ");
        }
    }

    /**
     * 双指针的方法。
     * 将后一个快指针p2指向的数据与前一个慢指针p1指向的数据进行对比，
     * 如果二者数据不相等就把p2指针的值赋值给p1指向的值，然后p2++
     * （由于数组是不完全递增的，所以不会出现前面已经赋值好了的数，在后面再出现。例：1，2，3，2中第二个2就不会出现）
     * 如果相等就让p2++，直到p2的值超过nums数组的最大索引
     *
     * @param nums 传入的数据是不严格递增的静态数组
     * @return 返回数组的前 p1+1 个值
     */
    public static int removeDuplicates(int[] nums) {
        int p1 = 0;
        int p2 = 0;

        while (p2 < nums.length) {
            if (nums[p1] == nums[p2]) {
                p2++;
            } else if (nums[p1] != nums[p2]) {
                nums[++p1] = nums[p2++];
            }
        }
        return p1 + 1;
    }
}